package exam.huawei.string;

import java.util.Scanner;

/**
 * 题目要求
 * https://blog.csdn.net/qfc_128220/article/details/127641506
 *
 * 100#101#1#5
 */
public class Example13 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(getResult(sc.nextLine()));
    }

    public static String getResult(String s) {
        String[] ip = s.split("#");

        // ip地址由四部分组成，少于或多于四部分都不合法
        if (ip.length != 4) return "invalid IP";

        // 如果ip地址四部分某部分不合法，则ip不合法
        if (!isValid(ip[0], 1, 128)
                || !isValid(ip[1], 0, 255)
                || !isValid(ip[2], 0, 255)
                || !isValid(ip[3], 0, 255)) {
            return "invalid IP";
        }

        // 这里需要转为long，某些情况使用int会整型溢出
        return Long.parseLong(
                getHexString(ip[0]) + getHexString(ip[1]) + getHexString(ip[2]) + getHexString(ip[3]),
                16)
                + "";
    }

    // ip组成是否合法
    public static boolean isValid(String s, int from, int to) {
        // 如果包含非数字字符，则不合法
        if (!s.matches("^\\d+$")) return false;

        // 如果包含前导0，则不和法，如012
        int num = Integer.parseInt(s);
        if (!s.equals(num + "")) return false;

        // 如果不是规定范围，则不合法
        return num >= from && num <= to;
    }

    // 获取十进制数字符串对应的十六进制数字符串
    public static String getHexString(String num) {
        String hexStr = Integer.toHexString(Integer.parseInt(num));
        // 补足前导0
        if (hexStr.length() < 2) hexStr = "0" + hexStr;
        return hexStr;
    }
}
